package com.party.core.service.member.impl;

import com.google.common.base.Function;
import com.google.common.base.Strings;
import com.party.common.paging.Page;
import com.party.common.utils.BigDecimalUtils;
import com.party.common.utils.DecimalUtil;
import com.party.common.utils.LangUtils;
import com.party.core.dao.read.member.MerchantAnalyzeReadDao;
import com.party.core.dao.write.member.MerchantAnalyzeWriteDao;
import com.party.core.model.BaseModel;
import com.party.core.model.member.MerchantAnalyze;
import com.party.core.model.member.MerchantAnalyzeQuery;
import com.party.core.service.member.IMerchantAnalyzeService;
import com.sun.istack.NotNull;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.Set;

/**
 * 机构分析接口实现
 * Created by wei.li
 *
 * @date 2017/9/11 0011
 * @time 16:31
 */

@Service
public class MerchantAnalyzeService implements IMerchantAnalyzeService {

    @Autowired
    private MerchantAnalyzeReadDao merchantAnalyzeReadDao;

    @Autowired
    private MerchantAnalyzeWriteDao merchantAnalyzeWriteDao;


    /**
     * 机构分析插入
     * @param merchantAnalyze 机构分析
     * @return 插入结果（true/false）
     */
    @Override
    public String insert(MerchantAnalyze merchantAnalyze) {
        BaseModel.preInsert(merchantAnalyze);

        boolean result = merchantAnalyzeWriteDao.insert(merchantAnalyze);
        if (result){
            return merchantAnalyze.getId();
        }
        return null;
    }

    /**
     * 机构分析更新
     * @param merchantAnalyze 机构分析
     * @return 更新结果（true/false）
     */
    @Override
    public boolean update(MerchantAnalyze merchantAnalyze) {
        return merchantAnalyzeWriteDao.update(merchantAnalyze);
    }

    /**
     * 逻辑删除
     * @param id 实体主键
     * @return 删除结果（true/false）
     */
    @Override
    public boolean deleteLogic(@NotNull String id) {
        if (Strings.isNullOrEmpty(id)){
            return false;
        }
        return merchantAnalyzeWriteDao.deleteLogic(id);
    }

    /**
     * 物理删除
     * @param id 实体主键
     * @return 删除结果（true/false）
     */
    @Override
    public boolean delete(@NotNull String id) {
        if (Strings.isNullOrEmpty(id)){
            return false;
        }
        return merchantAnalyzeWriteDao.delete(id);
    }

    /**
     * 批量删除
     * @param ids 主键集合
     * @return 删除结果（true/false）
     */
    @Override
    public boolean batchDeleteLogic(@NotNull Set<String> ids) {
        if (CollectionUtils.isEmpty(ids)){
            return false;
        }
        return merchantAnalyzeWriteDao.batchDeleteLogic(ids);
    }

    /**
     * 批量物理删除
     * @param ids 主键集合
     * @return 删除结果（true/false）
     */
    @Override
    public boolean batchDelete(@NotNull Set<String> ids) {
        if (CollectionUtils.isEmpty(ids)){
            return false;
        }
        return merchantAnalyzeWriteDao.batchDelete(ids);
    }

    /**
     * 根据编号获取
     * @param id 主键
     * @return 机构分析
     */
    @Override
    public MerchantAnalyze get(String id) {
        return merchantAnalyzeReadDao.get(id);
    }

    /**
     * 获取或者设置分析
     * @param memberId 会员编号
     * @return
     */
    @Override
    public MerchantAnalyze getSet(String memberId, Date date) {
        MerchantAnalyze merchantAnalyze = new MerchantAnalyze();
        merchantAnalyze.setMemberId(memberId);
        merchantAnalyze.setCreateDate(date);
        List<MerchantAnalyze> list = listPage(merchantAnalyze, null);
        if (!CollectionUtils.isEmpty(list)){
            return list.get(0);
        }
        else {
            this.insert(merchantAnalyze);
            return merchantAnalyze;
        }
    }

    /**
     * 分页查询
     * @param merchantAnalyze 机构分析
     * @param page 分页信息
     * @return 机构分析列表
     */
    @Override
    public List<MerchantAnalyze> listPage(MerchantAnalyze merchantAnalyze, Page page) {
        return merchantAnalyzeReadDao.listPage(merchantAnalyze, page);
    }


    /**
     * 分页查询
     * @param merchantAnalyzeQuery 查询条件
     * @param page 分页条件
     * @return 列表数据
     */
    @Override
    public List<MerchantAnalyze> sumList(MerchantAnalyzeQuery merchantAnalyzeQuery, Page page) {
        List<MerchantAnalyze> list = merchantAnalyzeReadDao.sumList(merchantAnalyzeQuery, page);

        list = LangUtils.transform(list, new Function<MerchantAnalyze, MerchantAnalyze>() {
            @Override
            public MerchantAnalyze apply(MerchantAnalyze merchantAnalyze) {
                merchantAnalyze.setMoney(BigDecimalUtils.round(merchantAnalyze.getMoney(), 2));
                return merchantAnalyze;
            }
        });
        return list;
    }

    /**
     * 统计机构
     * @param merchantAnalyzeQuery 查询条件
     * @return 机构数据
     */
    @Override
    public MerchantAnalyze sum(MerchantAnalyzeQuery merchantAnalyzeQuery) {
        List<MerchantAnalyze> list = this.sumList(merchantAnalyzeQuery, null);
        if (!CollectionUtils.isEmpty(list)){
            MerchantAnalyze merchantAnalyze = list.get(0);
            merchantAnalyze.setMoney(BigDecimalUtils.round(merchantAnalyze.getMoney(), 2));
            return merchantAnalyze;
        }
        return new MerchantAnalyze(0, 0, 0d, 0L, 0, 0);
    }

    /**
     * 所有列表
     * @param merchantAnalyze 机构分析
     * @return 机构分析列表
     */
    @Override
    public List<MerchantAnalyze> list(MerchantAnalyze merchantAnalyze) {
        return merchantAnalyzeReadDao.listPage(merchantAnalyze, null);
    }

    /**
     * 查询列表
     * @param merchantAnalyzeQuery 查询参数
     * @param page 分页参数
     * @return 数据
     */
    @Override
    public List<MerchantAnalyze> queryList(MerchantAnalyzeQuery merchantAnalyzeQuery, Page page) {
        return merchantAnalyzeReadDao.queryList(merchantAnalyzeQuery, page);
    }

    @Override
    public List<MerchantAnalyze> batchList(@NotNull Set<String> ids, MerchantAnalyze merchantAnalyze, Page page) {
        return null;
    }

    @Override
    public List<String> allMemberId() {
        return merchantAnalyzeReadDao.allMemberId();
    }

    /**
     * admin统计机构
     * @param merchantAnalyzeQuery 查询条件
     * @return 机构数据
     */
    @Override
    public MerchantAnalyze adminSum(MerchantAnalyzeQuery merchantAnalyzeQuery) {
        MerchantAnalyze merchantAnalyze = merchantAnalyzeReadDao.adminSumList(merchantAnalyzeQuery);
        if (merchantAnalyze != null){
            merchantAnalyze.setMoney(BigDecimalUtils.round(merchantAnalyze.getMoney(), 2));
            return merchantAnalyze;
        }
        return new MerchantAnalyze(0, 0, 0d, 0L, 0, 0);
    }

    /**
     * admin图表统计
     * @param merchantAnalyzeQuery
     * @return
     */
    @Override
    public List<MerchantAnalyze> adminChartList(MerchantAnalyzeQuery merchantAnalyzeQuery){
        return merchantAnalyzeReadDao.adminChartList(merchantAnalyzeQuery);
    }
}
